package com.lqk.demo.jmm.exercise;

/**
 * @author lqk
 * @date 2021/12/28 20:38
 */
public class Singleton4 {
    private Singleton4() { }
    // 问题1：解释为什么要加 volatile ?：保证有序性，防止指令重排带来的问题
    private static volatile Singleton4 INSTANCE = null;

    // 问题2：对比实现3, 说出这样做的意义 ：只有第一次调用才会加锁，后面不用加锁，性能更好
    public static Singleton4 getInstance() {
        if (INSTANCE != null) {
            return INSTANCE;
        }
        synchronized (Singleton4.class) {
            // 问题3：为什么还要在这里加为空判断, 之前不是判断过了吗
            if (INSTANCE != null) { // t2 
                return INSTANCE;
            }
            INSTANCE = new Singleton4();
            return INSTANCE;
        }
    }
}
